<?php

/**
 * 页面基础类
 * 
 * 提供页面实用功能，如获取安全参数等
 * 
 * @since 
 *  2013-9-3 1.0 created ; 
 *  2014-3-5 2.0 重写,继承Smarty
 * 
 * @author sutroon <14507247@qq.com>
 * @license http://www.sochishun.com
 * @version $Id: SoWebUtility.php v 1.0 2013-9-3 06:55:42Z sutroon Exp $
 * @package Core
 * @example 
 *      class IndexAction extends SoAction{
 *          public function index(){
 *              $id=$this->request_int('id');
 *              $this->assign('Title','Title '.$id);
 *              $this->display(); // 默认会读取与类名对应的模板文件(?action=Index.tpl.html)
 *          }
 *          public function update(){
 *              $id=$this->request_int('id');
 *              if($id==0) redirect('news_list');
 *              $m=new SoDataModule('tArticle');
 *              $this->dm->Title=request_string('Title','','POST');
 *              $this->dm->Content=request_string('Content');
 *              if($this->dm->update('ID='.$id)){
 *                  $this->dm->message('保存成功');
 *              }else{
 *                  $this->dm->message('保存失败：'.$this->dm->get_error(),'?id='.$id);
 *              }
 *          }   
 *      }
 */
class SoAction extends Smarty {

    // 字段和属性
    public $TplPath;

    /**
     * 页面构造器
     * 
     * 在具体页面按需初始化
     * @var ISoUIGenerator 
     */
    protected $uig;

    /**
     * 数据模型对象
     * 
     * 在具体页面按需初始化
     * @var SoDataModule 
     */
    public $dm;

    /**
     * 业务模型对象
     * 
     * 在具体页面按需初始化
     * @var SoBizCommon 
     */
    protected $biz;

    /**
     * 模块名称
     * @var string 
     */
    public $MODULE_NAME;

    /**
     * 构造函数
     * @param type $enableTemplate 是否需要初始化模板引擎
     */
    public function __construct($enableTemplate = true) {
        $this->MODULE_NAME = get_module_name();
        $this->dm = new SoDataModule();

        if ($enableTemplate) {
            parent::__construct();
            // 配置模板引擎环境
            $this->config_template_enginee();

            // 设置系统全局模板变量
            $this->assign('APP_DEMO', defined('APP_DEMO') ? APP_DEMO : false); // 是否演示模式,用于美工演示源码与程序运行代码之间的兼容
            $this->assign('MODULE_NAME', $this->MODULE_NAME); // url查询字符串中m的值
        }
    }

    public function __destruct() {
        unset($this->dm);
    }

    /**
     * 配置模板引擎函数 2013-9-3 by sutroon
     */
    private function config_template_enginee() {
        $modulename = isset($_GET['m']) ? trim_url_suffix(strtolower($_GET['m'])) : 'index';
        $this->TplPath = $modulename . '.html';
        parent::addPluginsDir(ROOT_PATH . 'Sites/AppPlugins/smarty_plugins/');
        $str_tpl = isset($_GET['tpl']) ? trim_url_suffix($_GET['tpl']) : '';
        if (!$str_tpl)
            $str_tpl = defined('TEMPLATE_NAME') ? TEMPLATE_NAME : 'Default';
        if (APP_DEMO)
            $this->caching = false;
        $this->template_dir = SITE_PATH . "Tpl/$str_tpl/";
        $this->compile_dir = SITE_PATH . "Data/AppData/";
        $this->config_dir = SITE_PATH . "";
        $this->cache_dir = SITE_PATH . "Data/Cache/";
        $this->left_delimiter = '<{';
        $this->right_delimiter = '}>';
    }

    /**
     * 注册方法
     * @param type $funcname
     * @param type $class
     * @param type $methodname
     * @example $this->register_method('demo2',$this,'demotest'); 
     *      使用：{demo2 v=$row['State']}
     * @since 1.0.0 2013-10-2 sutroon
     */
    public function register_method($funcname, $class, $methodname) {
        parent::registerPlugin('function', $funcname, array(&$class, $methodname));
    }

    /**
     * 显示模板(如果没有指定模板路径，则会自动以当前Action的名称为模板路径)
     * @param type $tplfile
     * @param type $cache_id
     * @param type $compile_id
     * @param type $parent
     * @example 如：$this->display('index.html');
     * @since 1.0.0 2013-9-16 sutroon
     */
    public function display($tplfile = null, $cache_id = null, $compile_id = null, $parent = null) {
        parent::display($tplfile ? $tplfile : $this->TplPath);
    }

    /**
     * 生成静态页
     * 如：makehtml("test.html", "html/test.html");
     * @param type $tplName 模板文件名称
     * @param type $htmlFilePath 静态html文件的路径
     * @since 1.0 2014-3-5 by sutroon
     */
    public function makeHtml($tplName='', $htmlFilePath='') {
        if($tplName=='') $tplName=  strtolower ($this->MODULE_NAME).'.html';
        if($htmlFilePath=='') $htmlFilePath='html/'.$tplName;
        $absHtmlFilePath=ROOT_PATH.$htmlFilePath;
        $dirpath=dirname($absHtmlFilePath);
        if(!is_dir($dirpath))        mkdir($dirpath, 0777, true);
        $htmlContext = parent::fetch($tplName);
        file_put_contents($absHtmlFilePath, $htmlContext);
    }

}

?>
